package com.malou.client.graficosestadisticos;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.extjs.gxt.charts.client.Chart;
import com.extjs.gxt.charts.client.event.ChartEvent;
import com.extjs.gxt.charts.client.event.ChartListener;
import com.extjs.gxt.charts.client.model.BarDataProvider;
import com.extjs.gxt.charts.client.model.ChartModel;
import com.extjs.gxt.charts.client.model.Legend;
import com.extjs.gxt.charts.client.model.Legend.Position;
import com.extjs.gxt.charts.client.model.ScaleProvider;
import com.extjs.gxt.charts.client.model.charts.BarChart;
import com.extjs.gxt.charts.client.model.charts.BarChart.BarStyle;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.Style.LayoutRegion;
import com.extjs.gxt.ui.client.Style.SelectionMode;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.util.Margins;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Label;
import com.extjs.gxt.ui.client.widget.Status;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.DateField;
import com.extjs.gxt.ui.client.widget.form.Field;
import com.extjs.gxt.ui.client.widget.form.Validator;
import com.extjs.gxt.ui.client.widget.grid.AggregationRowConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
import com.extjs.gxt.ui.client.widget.grid.RowNumberer;
import com.extjs.gxt.ui.client.widget.grid.SummaryType;
import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.Element;
import com.malou.client.MalouConstants;
import com.malou.client.util.Utilities;
import com.malou.client.ventas.tienda.Tiendas;

public class PrendasVendidasxFechaPanel extends ContentPanel{
	
	private MalouConstants constants = GWT.create(MalouConstants.class);
	private final Chart chart = new Chart("gxt/chart/open-flash-chart.swf");
	Grid<BeanModel> detalle;
	DateField desde;
	DateField hasta;
	Button find;
	Status status;
	PrendasVendidasxFechaPanel singleton;
	public ComboBox<BeanModel> tienda;
	Label tiendaL;	
	
	@Override  
	protected void onRender(Element parent, int index) {  
		super.onRender(parent, index);
		tienda.setRawValue(Utilities.tienda);
	}
	
	public PrendasVendidasxFechaPanel(){
		singleton = this;
		setFrame(true);  
        setCollapsible(true);  
        setAnimCollapse(false);  
        
        setIcon(IconHelper.createPath("images/icons/table.png"));  
        setHeading(constants.graficosPrendasVendidasxFecha());
        
                
        Tiendas.getComboTienda();
        
        tienda = new ComboBox<BeanModel>();       
	    tienda.setEditable(false);	    
	    tienda.setDisplayField("nombre");	    	    
	    tienda.setWidth(150);  
	    tienda.setStore(Tiendas.storeCombo);  
	    tienda.setTypeAhead(true);  
	    tienda.setTriggerAction(TriggerAction.ALL);
	    tienda.setValueField("nombre");
	    tienda.setUseQueryCache(false);
	    tienda.setAllowBlank(true);	    
	    
	    ToolBar toolBar = new ToolBar();
	    
	    tiendaL = new Label(constants.graficosTienda());
	    toolBar.add(tiendaL);
	    toolBar.add(tienda);
	    
	    desde = new DateField();        	
	    desde.getPropertyEditor().setFormat(DateTimeFormat.getFormat("yyyy-MM-dd"));
	    desde.setAllowBlank(false);	    
	    desde.setMaxValue(new Date());      
        
        Label desdeL = new Label(constants.graficosdesde());
        desdeL.setStyleAttribute("paddingLeft", "20px");
        
        toolBar.add(desdeL);
        toolBar.add(desde);
        
        hasta = new DateField();        	
        hasta.getPropertyEditor().setFormat(DateTimeFormat.getFormat("yyyy-MM-dd"));
        hasta.setAllowBlank(false);
        hasta.setValue(new Date());
        hasta.setMaxValue(new Date());      
        
        hasta.setValidator(new Validator() {			
			@Override
			public String validate(Field<?> field, String value) {
				if(desde.getValue() !=null && hasta.getValue() != null){
					if(desde.getValue().compareTo(hasta.getValue())>0)
						return constants.debesermayor();
					return null;
				}
				return null;
			}
		});
        
        Label hastaL = new Label(constants.graficoshasta());
        hastaL.setStyleAttribute("paddingLeft", "20px");
        
        toolBar.add(hastaL);
        toolBar.add(hasta);        
        
        status = new Status();
	    status.setBusy(constants.cargando());
	    status.hide();    
	    status.setAutoWidth(true);
	    status.setStyleAttribute("paddingLeft", "20px");
	    toolBar.add(status);
        
        find = new Button(constants.find(), IconHelper.createPath("images/icons/find.png"));
        find.setStyleAttribute("paddingLeft", "20px");
        
        SelectionListener<ButtonEvent> sl_find;        
        sl_find = new SelectionListener<ButtonEvent>(){
        	
        	@Override
			public void componentSelected(ButtonEvent ce) {		
				if(validate()){
					buscar();				
				}
			}
        };
        find.addSelectionListener(sl_find);
        
        toolBar.add(find);
        
        setTopComponent(toolBar);
        
        setLayout(new BorderLayout());
        
        BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER);  
        centerData.setMargins(new Margins(0));
        
        chart.setBorders(true);
                
        ChartModel model = new ChartModel(constants.graficosPrendasVendidasxFecha(), "font-size: 14px; font-family: Verdana; text-align: center;");  
        model.setBackgroundColour("#fefefe");
        model.setLegend(new Legend(Position.TOP, true));  
        model.setScaleProvider(ScaleProvider.ROUNDED_NEAREST_SCALE_PROVIDER); 
        
        BarChart bar = new BarChart(BarStyle.GLASS);          
        bar.setColour("#0000cc");
        
        BarDataProvider barProvider = new BarDataProvider("cantidad", "fecha");
        
        Graficos.getPrendasVendidasxFecha();
        
        barProvider.bind(Graficos.storePrendasVendidasxFecha);  
        bar.setDataProvider(barProvider);
        model.addChartConfig(bar);
        
        chart.setChartModel(model);
        
        ChartListener listener = new ChartListener() { 
        	public void chartClick(ChartEvent ce) {  
        		int row = ce.getChartConfig().getValues().indexOf(ce.getDataType()); 
        		GridSelectionModel<BeanModel> sm = detalle.getSelectionModel();
        		sm.select(row, true);
        	}
        };
        bar.addChartListener(listener);
        
        add(chart, centerData);
        
        BorderLayoutData southData = new BorderLayoutData(LayoutRegion.WEST, 183);  
        southData.setSplit(true);
       
        southData.setFloatable(true);  
        southData.setMargins(new Margins(0, 5, 0, 0));
        //grid
        
        RowNumberer r = new RowNumberer();
        
        List<ColumnConfig> columns = new ArrayList<ColumnConfig>();        
        columns.add(r);        
        
        columns.add(new ColumnConfig("fecha", constants.ventaFecha(), 70));
		
		ColumnConfig column = new ColumnConfig("cantidad", constants.ventaCantidad(), 70);
        column.setAlignment(HorizontalAlignment.RIGHT);        
        columns.add(column);
        
        ColumnModel cm = new ColumnModel(columns);
        
        AggregationRowConfig<BeanModel> total = new AggregationRowConfig<BeanModel>();
        total.setHtml("fecha", constants.ventaTotalResumen());        
        total.setSummaryType("cantidad", SummaryType.SUM);         
        total.setSummaryFormat("cantidad", NumberFormat.getFormat("0"));        
        cm.addAggregationRow(total);
        
        detalle = new Grid<BeanModel>(Graficos.storePrendasVendidasxFecha, cm);
        detalle.addPlugin(r);
        GridSelectionModel<BeanModel> sm = new GridSelectionModel<BeanModel>();
        sm.setSelectionMode(SelectionMode.SINGLE);
        detalle.setSelectionModel(sm);
        
        detalle.setLoadMask(true);  
        detalle.setBorders(true);
        
        add(detalle, southData);        
	}
	
	private boolean validate() {
		boolean des = desde.isValid();
		boolean has = hasta.isValid();
		boolean tien = tienda.isValid();
		return des && has && tien;
	}
	
	private void buscar(){
		status.show();
		find.hide();
		Graficos.fechainicial = desde.getValue();
		Graficos.fechafinal = hasta.getValue();
		
		if(tienda.getValue()!= null)
			Graficos.tienda_id = Integer.parseInt(tienda.getValue().get("id").toString());
		else
			Graficos.tienda_id = null;
		Graficos.pvxFecha = singleton;
		Graficos.loaderPrendasVendidasxFecha.load();	
	}
	
	public void setPermisos(List<String> permisos){
		boolean todas = permisos.contains("lastiendas");
		boolean su = permisos.contains("sutienda");
		
		if(todas){
			tiendaL.setVisible(true);
			tienda.setEnabled(true);
		    tienda.setVisible(true);		    
		}else if(su){
			tiendaL.setVisible(false);
			tienda.setEnabled(false);
		    tienda.setVisible(false);
		}
	}
}
